#include <signal.h>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>

#include <sys/wait.h>

using namespace std;

// void handler(int sig)
// {
//     cout << "signal handler:" << sig << endl;
// }

// int main()
// {
//     signal(2, handler);

//     cout << "pid:" << getpid() << endl;

//     while (1)
//     {
//         cout << "main doing!" << endl;
//         sleep(3);
//     }

//     return 0;
// }

// int main()
// {
//     int cnt = 5;

//     while (cnt--)
//     {
//         cout << "main doing!" << endl;
//         sleep(2);
//     }
//     abort();

//     return 0;
// }

// int cnt = 1;

// void handler_alarm(int sig)
// {
//     int n = alarm(5);
//     cout << "上次闹钟还剩" << n << "s\n";
// }
// int main()
// {
//     signal(14, handler_alarm);

//     alarm(100);

//     cout << "pid::" << getpid() << endl;

//     while (1)
//     {
//         sleep(100);
//     }
//     return 0;
// }

// int main()
// {
//     alarm(3);

//     int n = alarm(0);
//     cout << "闹钟还剩:" << n << endl;

//     sleep(3);
//     return 0;
// }

// int n = 0;
// void handler(int sig)
// {
//     cout << "signal handler:" << sig << " n:" << n++ << endl;
// }
// int main()
// {
//     signal(8, handler); // SIGFPE

//     int b = 10 / 0;

//     while (1)
//     {
//         cout << "man doing!" << endl;
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     cout << "signal handler:" << sig << endl;
// }
// int main()
// {
//     // signal(11, handler); // SIGSEGV (sigsegv)

//     int *p = nullptr;
//     *p = 100;

//     while (1)
//     {
//         cout << "man doing!" << endl;
//     }

//     return 0;
// }

// int main()
// {
//     int b = 10;
//     b /= 0;

//     while (1)
//     {
//         cout << "man doing!" << endl;
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     cout << "signal handler:" << sig << endl;
// }
// int main()
// {
//     signal(SIGCHLD, handler);

//     pid_t id = fork();
//     if (id == 0)
//     {
//         sleep(3);
//         exit(0);
//     }
//     while (1)
//     {
//         cout << "man doing !" << endl;
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     int rid = waitpid(-1, nullptr, 0);
//     if (rid > 0)
//         cout << "wait success!" << endl;
// }
// int main()
// {
//     signal(SIGCHLD, handler);
//     for (int i = 0; i < 5; i++)
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             sleep(3);
//             exit(0);
//         }
//     }
//     while (1)
//     {
//         cout << "man doing !" << endl;
//         sleep(1);
//     }

//     return 0;
// }

// void handler(int sig)
// {
//     while (true)
//     {
//         int rid = waitpid(-1, nullptr, WNOHANG);

//         if (rid > 0) // 等到一个子进程
//             cout << "wait success!" << endl;
//         else if (rid <= 0) // 没有等到一个子进程
//             break;
//     }
// }
// int main()
// {
//     signal(SIGCHLD, handler);
//     for (int i = 0; i < 5; i++) // 创建5个子进程
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             sleep(3); // 每个子进程3s后退出
//             exit(0);
//         }
//     }
//     while (1)
//     {
//         cout << "man doing !" << endl;
//         sleep(1);
//     }

//     return 0;
// }

// int main()
// {
//     int n = wait(nullptr);
//     if (n < 0)
//     {
//         perror("wait error");
//         exit(3);
//     }
//     return 0;
// }

int main()
{
    signal(SIGCHLD, SIG_IGN);

    pid_t id = fork();
    if (id == 0)
    {
        sleep(3);
        cout << "son" << endl;
        exit(0);
    }

    int n = wait(nullptr);
    if (n > 0)
        cout << "wait success!" << endl;
    else
        cout << "wait failed!" << endl;

    while (1)
    {
        cout << "man doing !" << endl;
        sleep(1);
    }

    return 0;
}
